import api from '@/services/api/memo.js';
import {
	location
} from '@/stores/location';

// 单例模式
let instance = null;

class getLocation {	
	constructor() {
		if (instance) {
			return instance
		};

		// 当前位置信息
		this.currentLocation = null;
		// 位置更新的回调函数（前台/后台更新都会触发）
		this.callback = null;
		// 是否正在跟踪
		this.isTracking = false;
		// 存储位置变化监听的回调ID（用于后续取消监听）
		this.locationChangeCallbackId = null;

		// 限制发送频率
		this.lastPostTime = 0;
		this.postInterval = 10 * 1000;
        
		// 本实例赋值给instance
		instance = this
	}
	/**
	 * onLocation和offLocation 的回调函数
	 * @param {Function} res 回调参数 
	 */
	
	listener = async (res) => {
		console.log('位置更新（前台/后台）:', res);
		// 保存最新位置
		this.currentLocation = res;
		
		const currentTime = Date.now();
		if (currentTime - this.lastPostTime >= this.postInterval) {
			// 向后端发送数据
			await location().locationChange(res.latitude, res.longitude)
			this.lastPostTime = currentTime
			console.log("utils/getLocation: 30s后才能发送")
		}
		else {
			console.log('currentTime:', currentTime,'/this.lastPostTime:', this.lastPostTime, '/this.postInterval:', this.postInterval)
		};
		
		// 触发回调，通知外部处理位置
		if (this.callback) {
			this.callback(res);
		};
	}

	/**
	 * 开始位置跟踪（支持前台+后台）
	 * @param {Function} callback 位置更新回调（参数为位置信息对象）
	 */
	startTracking(callback) {
		if (this.isTracking) {
			console.log('已在跟踪位置，无需重复启动');
			return;
		}

		// 保存回调函数
		this.callback = callback;
		this.isTracking = true;

		// 立即获取一次当前位置（保证启动时能拿到初始位置）
		this.getCurrentLocation();

		// 监听位置变化（前台+后台都会)
		uni.onLocationChange(this.listener);

		// 开启后台定位
		uni.startLocationUpdateBackground({
			success: () => {
				console.log('后台定位已开启，小程序退到后台也能获取位置');
			},
			fail: (err) => {
				console.error('开启后台定位失败:', err);
				// 失败时停止跟踪，避免异常状态
				this.stopTracking();
				// 常见失败原因：用户未授予后台定位权限、系统禁用微信定位
				if (err.errCode === 20003) {
					uni.showToast({
						title: '请授予后台定位权限',
						icon: 'none'
					});
				} else if (err.errCode === 20004) {
					uni.showToast({
						title: '系统已禁用微信定位',
						icon: 'none'
					});
				}
			}
		});
	}

	/**
	 * 主动获取一次当前位置（仅用于启动时初始化，后续依赖onLocationChange）
	 */
	getCurrentLocation() {
		uni.getLocation({
			type: 'gcj02', // 微信小程序默认坐标（国测局坐标，用于地图展示）
			altitude: true, // 获取高度信息（可选，根据需求关闭）
			success: (res) => {
				console.log('主动获取初始位置成功:', res);
				this.currentLocation = res;
				if (this.callback) {
					this.callback(res);
				}
			},
			fail: (err) => {
				console.error('主动获取初始位置失败:', err);
				if (this.callback) {
					// 把失败信息也传给回调，方便外部处理
					this.callback(null, err);
				}
			}
		});
	}

	/**
	 * 停止位置跟踪（必须调用，避免内存泄漏和耗电）
	 */
	stopTracking() {
		if (!this.isTracking) return;

		this.isTracking = false;
		this.callback = null; // 清空回调，避免内存泄漏

		// 取消位置变化监听
		uni.offLocationChange(this.listener)

		// 停止后台定位（关键：节省电量，避免后台持续耗电）
		uni.stopLocationUpdate({
			success: () => {
				console.log('后台定位已停止');
			},
			fail: (err) => {
				console.error('停止后台定位失败:', err);
			}
		});

		// 清空当前位置（可选，根据需求保留）
		this.currentLocation = null;
	}

	/**
	 * 获取最近一次保存的位置信息
	 * @returns {Object|null} 位置信息（null表示未获取过）
	 */
	getLastKnownLocation() {
		return this.currentLocation;
	}
}

export const locationTracker = new getLocation()